package lu.med.praxiswahl.wahlumed.service.beans;

import java.util.Calendar;
import java.util.List;
import java.util.Set;

import javax.ejb.EJB;
import javax.ejb.Remote;
import javax.ejb.Stateless;

import lu.med.praxiswahl.wahlumed.dao.beans.daointerface.OPH_KlasseEinsDAOInt;
import lu.med.praxiswahl.wahlumed.model.beans.BillsContentsTBL;
import lu.med.praxiswahl.wahlumed.model.beans.CustomerTBL;
import lu.med.praxiswahl.wahlumed.model.beans.HonorarTBL;
import lu.med.praxiswahl.wahlumed.model.beans.OPHonorar_KlasseEinsTBL;
import lu.med.praxiswahl.wahlumed.service.beans.serviceinterface.BillContentServiceInt;
import lu.med.praxiswahl.wahlumed.service.beans.serviceinterface.CustomerServiceInt;
import lu.med.praxiswahl.wahlumed.service.beans.serviceinterface.OPHonorarKlasseEins_ServiceInt;

/**
 * Session Bean implementation class OPHonorarKlasseEins_Service
 */
@Stateless
@Remote({ OPHonorarKlasseEins_ServiceInt.class })
public class OPHonorarKlasseEins_Service implements
		OPHonorarKlasseEins_ServiceInt {

	private HonorarTBL tmpBill;

	@EJB
	private OPH_KlasseEinsDAOInt billDao;

	@EJB
	private CustomerServiceInt cust;

	@EJB
	private BillContentServiceInt contentsService;

	/**
	 * Default constructor.
	 */
	public OPHonorarKlasseEins_Service() {
		tmpBill = new OPHonorar_KlasseEinsTBL();

	}

	@Override
	public boolean isCashPayed() {
		return tmpBill.isCash();
	}

	@Override
	public int create_PAYED_Bill(Long rechnungs_nummer, String matricule,
			Boolean erstellt, Boolean bezahlt, Calendar erstelltDatum) {
		HonorarTBL tmpBill_1 = new OPHonorar_KlasseEinsTBL();

		tmpBill_1.setRechnung_nummer(rechnungs_nummer);
		tmpBill_1.setCustomer(cust.getCustomer(matricule));
		tmpBill_1.setErstell_datum(erstelltDatum);

		tmpBill_1.setBezahlt(bezahlt);
		tmpBill_1.setErstellt(erstellt);

		billDao.persist(tmpBill_1);

		return RET_OPERATION_DONE_PROPERLY;
	}

	@Override
	public int create_ACTUAL_Bill(Long rechnungs_nummer, String matricule,
			Boolean erstellt, Boolean bezahlt, Calendar erstelltDatum) {
		HonorarTBL tmpBill_1 = new OPHonorar_KlasseEinsTBL();

		tmpBill_1.setRechnung_nummer(rechnungs_nummer);
		tmpBill_1.setCustomer(cust.getCustomer(matricule));
		tmpBill_1.setErstell_datum(erstelltDatum);

		tmpBill_1.setBezahlt(bezahlt);
		tmpBill_1.setErstellt(erstellt);

		billDao.persist(tmpBill_1);

		return RET_OPERATION_DONE_PROPERLY;
	}

	@Override
	public int create_NICHTERSTELLTE_Bill(Long rechnungs_nummer,
			Boolean erstellt, Boolean bezahlt, String matricule,
			Calendar erstelltDatum) {
		HonorarTBL tmpBill_1 = new OPHonorar_KlasseEinsTBL();

		tmpBill_1.setRechnung_nummer(rechnungs_nummer);
		tmpBill_1.setCustomer(cust.getCustomer(matricule));
		tmpBill_1.setErstell_datum(erstelltDatum);

		tmpBill_1.setBezahlt(bezahlt);
		tmpBill_1.setErstellt(erstellt);

		billDao.persist(tmpBill_1);

		return RET_OPERATION_DONE_PROPERLY;
	}

	@Override
	public CustomerTBL getPatientin() {
		return tmpBill.getCustomer();
	}

	@Override
	public double getAnzahlung() {
		return tmpBill.getAnzahlung();
	}

	@Override
	public Long[] getBillsNewerThanOf(String matricule, Calendar date) {
		List<HonorarTBL> bills = billDao.findBillsNewerThanOf(matricule, date);
		Long[] billsID = new Long[bills.size()];

		for (int i = 0; i < bills.size(); i++) {
			billsID[i] = bills.get(i).getRechnung_nummer();
		}
		return billsID;
	}

	@Override
	public Long[] getBillsOlderThanOf(String matricule, Calendar date) {
		List<HonorarTBL> bills = billDao.findBillsOlderThanOf(matricule, date);
		Long[] billsID = new Long[bills.size()];

		for (int i = 0; i < bills.size(); i++) {
			billsID[i] = bills.get(i).getRechnung_nummer();
		}
		return billsID;
	}

	@Override
	public Set<BillsContentsTBL> getContentsOfBill() {
		return ((OPHonorar_KlasseEinsTBL) tmpBill).getBillContent();
	}

	@Override
	public Calendar getErstellDatum() {
		return tmpBill.getErstell_datum();
	}

	@Override
	public Long[] getNichtErstellteRechnungen() {
		List<HonorarTBL> bills = billDao.findAvailable_NICHTERSTELLTE_Bills();
		Long[] billsID = new Long[bills.size()];

		for (int i = 0; i < bills.size(); i++) {
			billsID[i] = bills.get(i).getRechnung_nummer();
		}
		return billsID;
	}

	@Override
	public boolean isInPC() {
		return tmpBill.isImDossier();
	}

	@Override
	public boolean isBezahlt() {
		return tmpBill.isBezahlt();
	}

	@Override
	public boolean isCreated() {
		return tmpBill.isErstellt();
	}

	@Override
	public boolean isSchwanger() {
		return tmpBill.isSchwanger();
	}

	@Override
	public boolean isSent() {
		return tmpBill.isZugeschickt();
	}

	@Override
	public boolean kartePayed() {
		return tmpBill.isKarte();
	}

	@Override
	public int markBill_AS_NichtErstellt() {
		tmpBill.setErstellt(false);
		return RET_OPERATION_DONE_PROPERLY;
	}

	@Override
	public int markNichtErstellt_AS_Erstellt() {
		tmpBill.setErstellt(true);
		return RET_OPERATION_DONE_PROPERLY;
	}

	@Override
	public boolean payedBytransfer() {
		return tmpBill.isUeberweisung();
	}

	@Override
	public void setAnzahlnung(double anzahlung) {
		tmpBill.setAnzahlung(anzahlung);

	}

	@Override
	public void setBezahlt(boolean value) {
		tmpBill.setBezahlt(value);

	}

	@Override
	public void setCashPayed(boolean value) {
		tmpBill.setCash(value);

	}

	@Override
	public void setContentsOfBill(Set<BillsContentsTBL> contents) {
		((OPHonorar_KlasseEinsTBL) tmpBill).setBillContent(contents);

	}

	@Override
	public void setCreated(boolean value) {
		tmpBill.setErstellt(value);

	}

	@Override
	public void setErstellDatum(Calendar date) {
		tmpBill.setErstell_datum(date);

	}

	@Override
	public void setInPC(boolean value) {
		tmpBill.setImDossier(value);

	}

	@Override
	public void setKartePayed(boolean value) {
		tmpBill.setKarte(value);

	}

	@Override
	public void setSchwanger(boolean value) {
		tmpBill.setSchwanger(value);

	}

	@Override
	public void setSended(boolean value) {
		tmpBill.setZugeschickt(value);

	}

	@Override
	public void setpayedBytransfer(boolean value) {
		tmpBill.setUeberweisung(value);

	}

	@Override
	public int updateBill() {
		billDao.update(tmpBill);

		return RET_OPERATION_DONE_PROPERLY;
	}

	@Override
	public void getBill(Long rechnungs_nummer) {
		tmpBill = billDao.findBillsByID(rechnungs_nummer);
	}

	@Override
	public Long[] get_ERLEDIGTE_BillsByCustomer(String matricule) {
		List<HonorarTBL> bills = billDao
				.findAvailable_ERLEDIGTE_BillsByCustomer(matricule);
		Long[] billsID = new Long[bills.size()];

		for (int i = 0; i < bills.size(); i++) {
			billsID[i] = bills.get(i).getRechnung_nummer();
		}
		return billsID;
	}

	@Override
	public Long[] get_ERSTELLTE_BillsByCustomer(String matricule) {
		List<HonorarTBL> bills = billDao
				.findAvailable_ERSTELLTE_BillsByCustomer(matricule);
		Long[] billsID = new Long[bills.size()];

		for (int i = 0; i < bills.size(); i++) {
			billsID[i] = bills.get(i).getRechnung_nummer();
		}
		return billsID;
	}

	@Override
	public Long[] get_ACTUAL_BillsByCustomer(String matricule) {
		List<HonorarTBL> bills = billDao
				.findAvailable_ACTUAL_BillsByCustomer(matricule);
		Long[] billsID = new Long[bills.size()];

		for (int i = 0; i < bills.size(); i++) {
			billsID[i] = bills.get(i).getRechnung_nummer();
		}
		return billsID;
	}

	@Override
	public Long getSubPrimaryKeyIndex() {
		return billDao.findDatabaseSubPrimaryKeyIndex();
	}

	@Override
	public HonorarTBL getBillByID(Long rechnungs_nummer) {
		return billDao.findBillsByID(rechnungs_nummer);
	}

	@Override
	public String getBesonderheit() {
		return tmpBill.getBesonderheit();
	}

	@Override
	public boolean isRetransfered() {
		return tmpBill.isRueck_ueberweisung();
	}

	@Override
	public void setBesonderheit(String besonderheit) {
		tmpBill.setBesonderheit(besonderheit);

	}

	@Override
	public void setRetransfered(boolean value) {
		tmpBill.setRueck_ueberweisung(value);

	}

	@Override
	public String getKartenTyp() {
		return tmpBill.getKarten_typ();
	}

	@Override
	public void setKartenType(String karten_typ) {
		tmpBill.setKarten_typ(karten_typ);

	}

	/********************************************* FOR OPERATIONS WITH THE BILLCONTENTSERVICE **********************************************************/

	@Override
	public void getActualBillContentService(Long id) {
		contentsService.getBillContentService(id);

	}

	/*
	 * @Override public long getBillNumber_OF_ActualBillContent() { return
	 * contentsService.getBillNumber(); }
	 */

	@Override
	public BillsContentsTBL getBillContentByID_OF_ActualBillContent(Long id) {
		return contentsService.getBillContentByID(id);
	}

	@Override
	public Long[] getBillsContentByBillNumber(Long billNumber) {
		return contentsService.getBillsContentByBillNumber(billNumber);
	}

	@Override
	public String getCODE_TARIF_LIBELLE_OBJECT_OF_ActualBillContent() {
		return contentsService.getCODE_TARIF_LIBELLE_OBJECT();
	}

	@Override
	public String getDATE_DENT_HEURE_OF_ActualBillContent() {
		return contentsService.getDATE_DENT_HEURE();
	}

	@Override
	public String getH_OF_ActualBillContent() {
		return contentsService.getH();
	}

	@Override
	public String getMED_OF_ActualBillContent() {
		return contentsService.getMED();
	}

	@Override
	public String getMED_PRES_OF_ActualBillContent() {
		return contentsService.getMED_PRES();
	}

	@Override
	public double getMONTANT_OF_ActualBillContent() {
		return contentsService.getMONTANT();
	}

	@Override
	public void setCODE_TARIF_LIBELLE_OBJECT_OF_ActualBillContent(
			String code_libelle) {
		contentsService.setCODE_TARIF_LIBELLE_OBJECT(code_libelle);

	}

	@Override
	public void setDATE_DENT_HEURE_OF_ActualBillContent(String date_dent_heure) {
		contentsService.setDATE_DENT_HEURE(date_dent_heure);

	}

	@Override
	public void setH_OF_ActualBillContent(String h) {
		contentsService.setH(h);

	}

	@Override
	public void setMED_OF_ActualBillContent(String med) {
		contentsService.setMED(med);

	}

	@Override
	public void setMED_PRES_OF_ActualBillContent(String med_pres) {
		contentsService.setMED_PRES(med_pres);

	}

	@Override
	public void setMONTANT_OF_ActualBillContent(double montant) {
		contentsService.setMONTANT(montant);

	}

	@Override
	public int getNBR_OF_ActualBillContent() {
		return contentsService.getNBR();
	}

	@Override
	public void setNBR(int nbr) {
		contentsService.setNBR(nbr);

	}

	@Override
	public int deleteBill(Long id) {
		billDao.delete(id);
		return RET_OPERATION_DONE_PROPERLY;
	}

	@Override
	public String getRueckueberweisungDatum() {
		return tmpBill.getRueckueberweisung_datum();
	}

	@Override
	public void setRueckueberweisungDatum(String rueckueberweisung_datum) {
		tmpBill.setRueckueberweisung_datum(rueckueberweisung_datum);

	}

	@Override
	public double getAPayer() {
		return this.tmpBill.getAPayer();
	}

	@Override
	public String getNoten() {
		return this.tmpBill.getNoten();
	}

	@Override
	public void setAPayer(double payer) {
		this.tmpBill.setAPayer(payer);

	}

	@Override
	public void setNoten(String Noten) {
		this.tmpBill.setNoten(Noten);

	}

	@Override
	public int updateBillContent(BillsContentsTBL item) {
		this.contentsService.updateBillContents(item);

		return RET_OPERATION_DONE_PROPERLY;
	}

	@Override
	public BillsContentsTBL[] getBillsContentItemsByBillNumber(Long billNumber) {
		return contentsService.getBillsContentItemsByBillNumber(billNumber);
	}

}
